home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / RCS / Mig_GetAllInfo.c,v < prev    next >
Text File  |  1990-06-22  |  6KB  |  247 lines

  1. head     2.1;
  2. branch   ;
  3. access   ;
  4. symbols  no-auto-remigrate:2.1 installed:2.0;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 2.1
  10. date     90.06.22.14.58.21;  author douglis;  state Exp;
  11. branches ;
  12. next     2.0;
  13.  
  14. 2.0
  15. date     90.03.10.13.12.45;  author douglis;  state Stable;
  16. branches ;
  17. next     1.3;
  18.  
  19. 1.3
  20. date     90.03.10.13.10.55;  author douglis;  state Exp;
  21. branches ;
  22. next     1.2;
  23.  
  24. 1.2
  25. date     90.02.28.10.57.54;  author douglis;  state Exp;
  26. branches ;
  27. next     1.1;
  28.  
  29. 1.1
  30. date     90.02.16.14.28.47;  author douglis;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @Get info about one or more hosts from the global daemon.
  37. @
  38.  
  39.  
  40. 2.1
  41. log
  42. @changes for alarms for timeouts with migd and for printing to stderr instead of syslog
  43. @
  44. text
  45. @/* 
  46.  * Mig_GetAllInfo.c --
  47.  *
  48.  *    Get info about one or more hosts from the global daemon.
  49.  *
  50.  * Copyright 1990 Regents of the University of California
  51.  * Permission to use, copy, modify, and distribute this
  52.  * software and its documentation for any purpose and without
  53.  * fee is hereby granted, provided that the above copyright
  54.  * notice appear in all copies.  The University of California
  55.  * makes no representations about the suitability of this
  56.  * software for any purpose.  It is provided "as is" without
  57.  * express or implied warranty.
  58.  */
  59.  
  60. #ifndef lint
  61. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_GetAllInfo.c,v 2.0 90/03/10 13:12:45 douglis Stable Locker: douglis $ SPRITE (Berkeley)";
  62. #endif not lint
  63.  
  64.  
  65. #include <sprite.h>
  66. #include <stdio.h>
  67. #include <mig.h>
  68. #include <kernel/net.h>
  69. #include <errno.h>
  70.  
  71. extern int errno;
  72. extern char *strerror();
  73. extern char *malloc();
  74.  
  75. /*
  76.  * The maximum number of records we transfer in a single ioctl.
  77.  */
  78. #define MAX_RECS 20
  79.  
  80. /*
  81.  *----------------------------------------------------------------------
  82.  *
  83.  * Mig_GetAllInfo --
  84.  *
  85.  *    Get the records for all hosts, up to the number of hosts specified.
  86.  *
  87.  * Results:
  88.  *    The number of valid records found is returned, and the data are
  89.  *    placed in *infoPtr.  Upon error, -1 is returned.
  90.  *
  91.  * Side effects:
  92.  *    The global daemon is contacted if it has not been already.
  93.  *
  94.  *----------------------------------------------------------------------
  95.  */
  96. int
  97. Mig_GetAllInfo(infoPtr, numRecs)
  98.     Mig_Info *infoPtr;        /* Pointer to array of structures */
  99.     int numRecs;        /* number of structures in *infoPtr */
  100. {
  101.     Mig_InfoRequest request;
  102.     static int init = 0;    /* Initialized? */
  103.     static char *buffer;     /* Dynamically-allocated buffer for result
  104.                    of ioctl. */
  105.     static unsigned int bufSize;/* Size of buffer. */
  106.     int status;            /* Status of system calls. */
  107.     int maxRecs = MAX_RECS;    /* Maximum number of recs in one ioctl. */
  108.     int obtained;        /* Number obtained thus far. */
  109.     int got;            /* Number obtained in one iteration. */
  110.     int nextHost;        /* Next entry to look for. */
  111.     int retry = 1;        /* Whether to retry after failed ioctl. */
  112.  
  113.  
  114.     if (mig_GlobalPdev < 0) {
  115.     if (MigOpenPdev(TRUE) < 0) {
  116.         return(-1);
  117.     }
  118.     }
  119.  
  120.     if (!init) {
  121.     init = 1;
  122.     bufSize = 2 * sizeof(int) +  maxRecs * sizeof(Mig_Info);
  123.     buffer = malloc(bufSize);
  124.     if (buffer == (char *) NULL) {
  125.         errno = ENOMEM;
  126.         init = 0;
  127.         return(-1);
  128.     }
  129.     }
  130.     nextHost = 1;
  131.  
  132.     for (obtained = 0; obtained < numRecs;) {
  133.     request.numRecs = maxRecs;
  134.     request.firstHost = nextHost;
  135.  
  136.     if (MigSetAlarm() < 0) {
  137.         fprintf(stderr,
  138.             "Error setting alarm for contact with migd.\n");
  139.         return(-1);
  140.     }
  141.     status = Fs_IOControl(mig_GlobalPdev, IOC_MIG_GETINFO,
  142.                   sizeof(Mig_InfoRequest),
  143.                   (char *) &request,
  144.                   bufSize, buffer);
  145.     if (MigClearAlarm() < 0) {
  146.         fprintf(stderr,
  147.             "Error clearing alarm for contact with migd.\n");
  148.     }
  149.     if (status != SUCCESS) {
  150.         close(mig_GlobalPdev);
  151.         mig_GlobalPdev = 0;
  152.         if (retry == 0 || MigOpenPdev(TRUE) < 0) {
  153.         fprintf(stderr,
  154.                "Mig_GetAllInfo: error during ioctl to global master: %s\n",
  155.                Stat_GetMsg(status));
  156.         errno = Compat_MapCode(status);
  157.         return(-1);
  158.         }
  159.         retry = 0;
  160.         continue;
  161.     }
  162.     retry = 1;
  163.     got = *((int *) buffer);
  164.     if (got == 0) {
  165.         break;
  166.     }
  167.     obtained += got;
  168.     bcopy(buffer + 2 * sizeof(int), (char *) infoPtr,
  169.           got * sizeof(Mig_Info));
  170.     if (got < maxRecs) {
  171.         break;
  172.     }
  173.     nextHost = infoPtr[got-1].hostID + 1;
  174.     infoPtr += got;
  175.     }
  176.     
  177.     return(obtained);
  178.     
  179. }
  180. @
  181.  
  182.  
  183. 2.0
  184. log
  185. @Changing version numbers.
  186. @
  187. text
  188. @d17 1
  189. a17 1
  190. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_GetAllInfo.c,v 1.3 90/03/10 13:10:55 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  191. d22 1
  192. a23 1
  193. #include <syslog.h>
  194. d92 5
  195. d101 4
  196. d109 1
  197. a109 1
  198.         syslog(LOG_WARNING,
  199. @
  200.  
  201.  
  202. 1.3
  203. log
  204. @changed when it prints syslog message
  205. @
  206. text
  207. @d17 1
  208. a17 1
  209. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_GetAllInfo.c,v 1.2 90/02/28 10:57:54 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  210. @
  211.  
  212.  
  213. 1.2
  214. log
  215. @changed Mig_OpenPdev to internal Mig routine.
  216. @
  217. text
  218. @d17 1
  219. a17 1
  220. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_GetAllInfo.c,v 1.1 90/02/16 14:28:47 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  221. a96 3
  222.         syslog(LOG_WARNING,
  223.            "Mig_GetAllInfo: error during ioctl to global master: %s\n",
  224.            Stat_GetMsg(status));
  225. d100 3
  226. @
  227.  
  228.  
  229. 1.1
  230. log
  231. @Initial revision
  232. @
  233. text
  234. @d4 1
  235. a4 1
  236.  *    Source code for the Mig_GetAllInfo procedure.
  237. d17 1
  238. a17 1
  239. static char rcsid[] = "$Header: /user2/douglis/pdev_mig/mig_p/RCS/Mig_GetAllInfo.c,v 1.3 90/02/13 10:07:13 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  240. d71 1
  241. a71 1
  242.     if (Mig_OpenPdev(TRUE) < 0) {
  243. d102 1
  244. a102 1
  245.         if (retry == 0 || Mig_OpenPdev(TRUE) < 0) {
  246. @
  247.